home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
Data.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-25
|
10KB
|
585 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "Data.h"
#include "Class.h"
#include "OrdColl.h"
#include "FileBuf.h"
#include "MemBuf.h"
#include "String.h"
#include "System.h"
#include "ProgressDialog.h"
#include "Directory.h"
#include "Converter.h"
enum ePathInfoFlags {
ePiExec = 1,
ePiDir = 2,
ePiSpecial = 4
};
//---- bitmap images for file icons --------------------------------------------
static u_short DirectoryBits[]= {
# include "images/directory.image"
};
static u_short ExecBits[]= {
# include "images/exec.image"
};
static u_short AsciiBits[]= {
# include "images/ascii.image"
};
static u_short EtBits[]= {
# include "images/et++.image"
};
static u_short FileBits[]= {
# include "images/file.image"
};
SmartBitmap gETIcon("et.xpm"), // gETIcon(gPoint16, EtBits),
gDirectoryIcon("directory.xpm"), // gDirectoryIcon(gPoint16, DirectoryBits),
gExecIcon("exec.xpm"), // gExecIcon(gPoint16, ExecBits),
gAsciiIcon("ascii.xpm"), // gAsciiIcon(gPoint16, AsciiBits),
gFileIcon("file.xpm"); // gFileIcon(gPoint16, FileBits);
//---- Data --------------------------------------------------------------------
NewMetaImpl(Data,Object, (TP(name), T(creator), T(type), TB(isnew), TP(classtype)));
Data::Data(bool untitled, char *n)
{
name= strsave(n);
isnew= untitled;
classtype= 0;
type= cDocTypeUndef;
creator= cDocCreatorUndef;
converter= 0;
}
Data::~Data()
{
SafeDelete(name);
converter= 0;
}
bool Data::IsUntitled()
{
return isnew;
}
Symbol Data::Type()
{
return type;
}
Symbol Data::Creator()
{
return creator;
}
int Data::SizeHint()
{
return -1;
}
char *Data::FullName()
{
return name;
}
char *Data::ShortName()
{
return FullName();
}
long Data::UniqueId()
{
return 0;
}
StreamBuf *Data::GetStreamBuf()
{
return 0;
}
static bool forwriting;
StreamBuf *Data::GetStreamBufForReading()
{
forwriting= FALSE;
StreamBuf *sb= GetStreamBuf();
forwriting= FALSE;
sb->seek(0);
return sb;
}
StreamBuf *Data::GetStreamBufForWriting()
{
forwriting= TRUE;
StreamBuf *sb= GetStreamBuf();
forwriting= FALSE;
return sb;
}
long Data::ModifiedAt()
{
return 0;
}
bool gPaste;
static OrdCollection *converters;
Object *Data::AsObject(Class *want)
{
if (gPaste) {
if (converters == 0)
converters= new OrdCollection;
Converter *cv= Converter::FindConverter(this, want, converters);
if (converters->Size() <= 0)
SafeDelete(converters);
converter= 0;
} else {
if (converter == 0) {
if (converters == 0 || converters->Size() <= 0) {
if (converters == 0)
converters= new OrdCollection;
converter= Converter::FindConverter(this, want, converters);
}
converter= Converter::SelectConverter(converters);
SafeDelete(converters);
}
if (converter && converter->CanConvert(this, want))
return converter->Convert(this, want);
}
return 0;
}
bool Data::FindConvertersFor(Class *w1, Class *w2, Class *w3, Class *w4, Class *w5)
{
if (w1 && CanConvert(w1))
return TRUE;
if (w2 && CanConvert(w2))
return TRUE;
if (w3 && CanConvert(w3))
return TRUE;
if (w4 && CanConvert(w4))
return TRUE;
if (w5 && CanConvert(w5))
return TRUE;
return FALSE;
}
bool Data::CanConvert(Class *want)
{
return Converter::FindConverter(this, want) != 0;
}
Bitmap *Data::GetBitmap()
{
return gFileIcon;
}
bool Data::IsDirectory()
{
return FALSE;
}
bool Data::IsCCode()
{
return FALSE;
}
bool Data::IsETFormat()
{
return FALSE;
}
bool Data::IsAscii()
{
return FALSE;
}
bool Data::IsValid()
{
return FALSE;
}
bool Data::IsWritable()
{
return FALSE;
}
bool Data::IsReadable()
{
return FALSE;
}
bool Data::IsExecutable()
{
return FALSE;
}
SeqCollection *Data::GetContents()
{
return 0;
}
bool Data::HasContents()
{
return FALSE;
}
Data *Data::GetParent()
{
return 0;
}
OStream& Data::PrintOn(OStream &s)
{
Object::PrintOn(s);
s.PrintString(name);
return s << creator SP << type SP << isnew SP << (long)(classtype) SP
<< (long)(converter) SP;
}
IStream& Data::ReadFrom(IStream &s)
{
long ct, cv;
Object::ReadFrom(s);
SafeDelete(name);
s.ReadString(&name);
s >> creator >> type >> isnew >> ct >> cv;
classtype= (Class*) ct;
converter= (Converter*) cv;
return s;
}
//---- FileData ----------------------------------------------------------------
NewMetaImpl(FileData, Data, (T(sizehint), T(modtime), T(uniqueid), TB(valid)));
FileData::FileData(char *nm, bool untitled, bool deep) : Data(untitled)
{
lookDeep= deep;
isDeep= 0;
isAscii= isExec= isDir= FALSE;
isCCode= isETFormat= FALSE;
uniqueid= 0;
sizehint= -1;
valid= FALSE;
if (nm) {
if (nm[0] != '/' && !untitled) {
char *wd= gSystem->WorkingDirectory();
if (strcmp(nm, ".") == 0)
name= strsave(wd);
else {
if (wd && strcmp(wd, "/"))
name= strsave(form("%s/%s", wd, nm));
else
name= strsave(form("/%s", nm));
}
} else
name= strsave(nm);
}
}
char *FileData::FullName()
{
return name;
}
bool FileData::IsAscii()
{
WhatType();
return isAscii;
}
bool FileData::IsCCode()
{
WhatType();
return isCCode;
}
bool FileData::IsETFormat()
{
if (classtype)
return TRUE;
WhatType();
return isETFormat;
}
bool FileData::IsDirectory()
{
WhatType();
return isDir;
}
bool FileData::IsValid()
{
return valid;
}
bool FileData::IsUntitled()
{
//return Data::IsUntitled();
return *FullName() != '/';
}
long FileData::ModifiedAt()
{
WhatType();
return modtime;
}
Symbol FileData::Creator()
{
WhatType(TRUE);
return creator;
}
bool FileData::IsWritable()
{
char *nm= FullName();
if (gSystem->AccessPathName(nm, 0)) {
char *p= strrchr(nm, '/'), buf[1000];
if (p) {
strcpy(buf, nm);
p= strrchr(buf, '/');
*p= 0;
} else
strcpy(buf, ".");
nm= buf;
}
return !gSystem->AccessPathName(nm, 2);
}
bool FileData::IsReadable()
{
return !gSystem->AccessPathName(FullName(), 4);
}
bool FileData::IsExecutable()
{
WhatType();
return isExec;
}
Bitmap *FileData::GetBitmap()
{
if (IsDirectory())
return gDirectoryIcon;
if (IsExecutable())
return gExecIcon;
if (IsCCode())
return gAsciiIcon;
if (lookDeep) {
if (IsETFormat())
return gETIcon;
if (IsAscii())
return gAsciiIcon;
}
return Data::GetBitmap();
}
StreamBuf *FileData::GetStreamBuf()
{
//StreamBuf *sb= new ProgressFilter;
//sb->SetBaseStream(new Filebuf(FullName(), forwriting ? output : input));
//return sb;
return new Filebuf(FullName(), forwriting ? output : input);
}
Symbol FileData::Type()
{
WhatType(TRUE);
return type;
}
long FileData::UniqueId()
{
WhatType();
return uniqueid;
}
int FileData::SizeHint()
{
WhatType();
return sizehint;
}
char *FileData::ShortName()
{
return BaseName(FullName());
}
char *FileData::GetLoadDir()
{
return gSystem->DirName(FullName());
}
void FileData::WhatType(bool deep)
{
TypeMatcher *tm;
int flags= 0;
if (isDeep >= 2)
return;
deep= deep || lookDeep;
if (isDeep == 0) {
if (gSystem) {
isDeep= 1;
valid= gSystem->GetPathInfo(FullName(), &uniqueid, &sizehint,
&flags, &modtime) == 0;
if (flags & ePiDir) {
isDir= TRUE;
type= cDocTypeDirectory;
isDeep= 2;
return;
}
if (flags & ePiSpecial) {
type= cDocTypeSpecial;
isDeep= 2;
return;
}
if (flags & ePiExec)
isExec= TRUE;
}
tm= TypeMatcher::MatchByName(FullName(), strlen(FullName()));
if (tm) {
type= tm->type;
isAscii= tm->ascii;
isCCode= tm->isCCode;
creator= tm->creator;
isETFormat= tm->isETFormat;
}
}
if (!deep)
return;
if (isDeep > 1)
return;
isDeep= 2;
tm= TypeMatcher::MatchByContents(FullName());
if (tm) {
type= tm->type;
isAscii= tm->ascii;
isCCode= tm->isCCode;
creator= tm->creator;
isETFormat= tm->isETFormat;
}
}
SeqCollection *FileData::GetContents()
{
Dir dir(FullName());
char *nm;
OrdCollection *files= new OrdCollection;
for (int i= 0; nm= dir(); i++)
if (strcmp(nm, "."))
files->Add(new FileData(nm));
return files;
}
bool FileData::HasContents()
{
return IsDirectory();
}
Data *FileData::GetParent()
{
char buf[200], *cp, *fname= FullName();
if (strcmp(fname, "/") == 0)
return 0;
strcpy(buf, fname);
if (cp= strrchr(buf, '/')) {
*cp= 0;
}
if (cp == buf)
return new FileData("/");
return new FileData(buf);
}
OStream& FileData::PrintOn(OStream &s)
{
Data::PrintOn(s);
return s << sizehint SP << modtime SP << uniqueid SP << valid SP
<< isETFormat SP << isSystem SP << isAscii SP << lookDeep SP
<< isCCode SP << isExec SP << isDeep SP << isDir SP;
}
IStream& FileData::ReadFrom(IStream &s)
{
Data::ReadFrom(s);
return s >> sizehint >> modtime >> uniqueid >> valid
>> isETFormat >> isSystem >> isAscii >> lookDeep
>> isCCode >> isExec >> isDeep >> isDir;
}
//---- StreamBufData -----------------------------------------------------------------
NewMetaImpl0(StreamBufData,Data);
StreamBufData::StreamBufData(StreamBuf *s, const Symbol &t)
: Data(FALSE, "streambufdata")
{
sb= s;
type= t;
}
void StreamBufData::SetType(Symbol t)
{
type= t;
}
int StreamBufData::SizeHint()
{
return sb->tell();
}
StreamBuf *StreamBufData::GetStreamBuf()
{
return sb;
}
//---- ObjectData --------------------------------------------------------------
NewMetaImpl0(ObjectData,Data);
ObjectData::ObjectData(Object *op) : Data()
{
object= op;
classtype= object->IsA();
type= cDocTypeET;
}
ObjectData::~ObjectData()
{
SafeDelete(object);
}
Object *ObjectData::AsObject(Class *want)
{
if (GetClassType()->isKindOf(want))
return object->DeepClone();
return 0;
}
bool ObjectData::CanConvert(Class *want)
{
return GetClassType()->isKindOf(want);
}